package fr.afcepf.atod19.patisserie.test;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List;

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;

import fr.afcepf.atod19.patisserie.business.BusinessPatisserieImpl;
import fr.afcepf.atod19.patisserie.business.IBusinessPatisserie;
import fr.afcepf.atod19.patisserie.data.IDataPatisserie;
import fr.afcepf.atod19.patisserie.entity.Patisserie;

public class testBusinessPatisserieAvecMockBusiness {
    private Patisserie patisserieRecherchee;
    private Patisserie patisserieSuppOk;
    private Patisserie patisserieSuppPOk;
    private Patisserie patisserieAjout;
    private Patisserie patisserieAjoutNomTropLong;
    private Patisserie patisserieAjoutDescriptionNull;
    private List<Patisserie> listeRechercherOk;
    private List<Patisserie> listeRechercherPOk;
    private IBusinessPatisserie businessPatisserie;

    @Before
    public void setUp(){
        patisserieAjout = new Patisserie(null, 1.0f, "patisserieAjout", "aAjouter", 15);
        patisserieAjoutNomTropLong = new Patisserie(null, 1.0f, "slfhkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
                + "sjkdvvvvvvbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                + "sdkjvbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                + "vdjl", "aAjouter", 15);
        patisserieAjoutDescriptionNull = new Patisserie(null, 1.0f, "patisserieAjout", null, 15);
        patisserieRecherchee = new Patisserie(1,2.5f,"eclair", "chocolat", 500);
        patisserieSuppOk = new Patisserie();
        patisserieSuppOk.setId(2);
        patisserieSuppPOk = new Patisserie();
        patisserieSuppPOk.setId(5);
        listeRechercherOk = new ArrayList<Patisserie>();
        listeRechercherOk.add(patisserieRecherchee);
        listeRechercherPOk = new ArrayList<Patisserie>();
        businessPatisserie = new BusinessPatisserieImpl(); 
        IDataPatisserie mockData = EasyMock.createMock(IDataPatisserie.class);
        EasyMock.expect(mockData.ajouter(patisserieAjout)).andReturn(3);
        EasyMock.expect(mockData.ajouter(patisserieAjoutNomTropLong)).andReturn(null);
        EasyMock.expect(mockData.ajouter(patisserieAjoutDescriptionNull)).andReturn(null);
        EasyMock.expect(mockData.ajouter(patisserieRecherchee)).andReturn(null);
        EasyMock.expect(mockData.manger(patisserieSuppOk)).andReturn(true);
        EasyMock.expect(mockData.manger(patisserieSuppPOk)).andReturn(false);
        EasyMock.expect(mockData.rechercher("eclair")).andReturn(listeRechercherOk);
        EasyMock.expect(mockData.rechercher("pas eclair")).andReturn(listeRechercherPOk);
        EasyMock.expect(mockData.rechercher(patisserieAjout.getNom())).andReturn(null);
        EasyMock.expect(mockData.rechercher(patisserieAjoutNomTropLong.getNom())).andReturn(null);
        EasyMock.expect(mockData.rechercher(patisserieAjoutDescriptionNull.getNom())).andReturn(null);
        ((BusinessPatisserieImpl)businessPatisserie).setDataPatisserie(mockData);
        EasyMock.replay(mockData);
    }

    @Test
    public void testAjoutNominal() {
        Integer retour = businessPatisserie.add(patisserieAjout);
        assertNotNull(retour);
        assertEquals(3, retour.intValue());
    }

    @Test
    public void testAjoutNomTroplong(){
        Integer retour = 
                businessPatisserie.add(patisserieAjoutNomTropLong);
        assertNull(retour);
    }

    @Test
    public void testAjoutDscriptionNull() {
        Integer retour = 
                businessPatisserie.add(patisserieAjoutDescriptionNull);
        assertNull(retour);
    }

    @Test
    public void testAjoutPatisserieExist() {
        Integer retour = businessPatisserie.add(patisserieRecherchee);
        assertNull(retour);
    }

    @Test
    public void testSuppressionOk() {
        Boolean retour =
                businessPatisserie.remove(patisserieSuppOk);
        assertNotNull(retour);
        assertEquals(retour, true);
    }

    @Test
    public void testSuppressionPOk() {
        Boolean retour =
                businessPatisserie.remove(patisserieSuppPOk);
        assertNotNull(retour);
        assertEquals(retour, false);
    }

    @Test
    public void testRechercheOk() {
        List<Patisserie> retour = businessPatisserie.find("eclair"); 
        assertNotNull(retour);
        assertEquals(listeRechercherOk.size(),retour.size());
        Patisserie pat = retour.get(0);
        assertNotNull(pat);
        assertNotNull(pat.getId());
        assertNotNull(pat.getNom());
        assertNotNull(pat.getDescription());
        assertNotNull(pat.getPrix());
        assertEquals(patisserieRecherchee.getId(), pat.getId());
        assertEquals(patisserieRecherchee.getNom(), pat.getNom());
        assertEquals(patisserieRecherchee.getDescription(), pat.getDescription());
        assertEquals(patisserieRecherchee.getPrix(), pat.getPrix());
    }
    @Test
    public void testRecherchePOk() {
        List<Patisserie> retour = businessPatisserie.find("pas eclair");
        assertNotNull(retour);
        assertEquals(retour.size(),0);
    }
}
